﻿#region NamesSpace
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint;
using MS.InformationManagement.DAL.DTOs;
using MS.InformationManagement.Support.Constants;
using MS.InformationManagement.DAL.DocumentCenter;
using MS.InformationManagement.Support;
#endregion

namespace MS.InformationManagement.BLL.SolicitudesPrestamo
{
    public class SolicitudesPrestamo
    {
        public static List<SolicitudDePrestamosContentType> ObtenerMisSolicitudesPrestamoEnviadas(Guid targetList, int pageIndex, int pageSize, out int totalRecords)
        {
            List<SolicitudDePrestamosContentType> listResult = new List<SolicitudDePrestamosContentType>();
            int startingPosition = pageIndex * pageSize;

            SPList currentList = SPContext.Current.Web.Lists[targetList];
            SPUser user = SPContext.Current.Web.EnsureUser(currentList.Title);
            SPQuery query = new SPQuery();
            query.Query = @"<Where>
                          <And>
                             <Eq>
                                <FieldRef Name='Prestamos_User_Solicitud' LookupId='TRUE' />
                                <Value Type='User'>" + user.ID +@"</Value>
                             </Eq>
                             <Or>
                                <IsNull>
                                   <FieldRef Name='Prestamos_Estado' />
                                </IsNull>
                                <Eq>
                                   <FieldRef Name='Prestamos_Estado' />
                                   <Value Type='Choice'>Pendiente</Value>
                                </Eq>
                             </Or>
                          </And></Where>";

            listResult = CargarSolicitudes(query, user);
            totalRecords = listResult.Count();

            return listResult.Skip(startingPosition).Take(pageSize).ToList();
        }

        public static List<SolicitudDePrestamosContentType> ObtenerMisSolicitudesPrestamoRecibidas(Guid targetList, int pageIndex, int pageSize, out int totalRecords)
        {
            List<SolicitudDePrestamosContentType> listResult = new List<SolicitudDePrestamosContentType>();
            int startingPosition = pageIndex * pageSize;

            SPList currentList = SPContext.Current.Web.Lists[targetList];
            SPUser user = SPContext.Current.Web.EnsureUser(currentList.Title);
            
            SPQuery query = new SPQuery();
            query.Query = "<Where><And><Eq><FieldRef Name='" + CustomSiteColumns.FIELD_SOLICITUD_PRESTAMOS_USER_PRESTAMO + "' LookupId= 'TRUE'/><Value Type='User'>" + user.ID + "</Value></Eq><IsNull><FieldRef Name='" + CustomSiteColumns.FIELD_SOLICITUD_PRESTAMOS_ESTADO + "' /></IsNull></And></Where>";


            listResult = CargarSolicitudes(query, user);
            totalRecords = listResult.Count();

            return listResult.Skip(startingPosition).Take(pageSize).ToList();
        }

        public static List<SolicitudDePrestamosContentType> ObtenerPrestamos(Guid targetList)
        {
            List<SolicitudDePrestamosContentType> listResult = new List<SolicitudDePrestamosContentType>();

            SPList currentList = SPContext.Current.Web.Lists[targetList];
            SPQuery query = new SPQuery();
            query.Query = @"<Where>
                          <And>
                             <Eq>
                                <FieldRef Name='" + CustomSiteColumns.FIELD_SOLICITUD_PRESTAMOS_USER_SOLICITUD + @"' LookupId= 'TRUE'/>
                                <Value Type='User'>" + SPContext.Current.Web.CurrentUser.ID + @"</Value>
                             </Eq>
                             <Eq>
                                <FieldRef Name='" + CustomSiteColumns.FIELD_SOLICITUD_PRESTAMOS_ESTADO + @"' />
                                <Value Type='Choice'>"+EstadoDePrestamo.Aceptado+@"</Value>
                             </Eq>
                          </And>
                       </Where>";

            listResult = CargarSolicitudes(query, SPContext.Current.Web.CurrentUser);

            return listResult;
        }

        public static List<SolicitudDePrestamosContentType> ObtenerPrestados(Guid targetList)
        {
            List<SolicitudDePrestamosContentType> listResult = new List<SolicitudDePrestamosContentType>();

            SPList currentList = SPContext.Current.Web.Lists[targetList];
            SPQuery query = new SPQuery();
            query.Query = @"<Where>
                          <And>
                             <Eq>
                                <FieldRef Name='" + CustomSiteColumns.FIELD_SOLICITUD_PRESTAMOS_USER_PRESTAMO + @"' LookupId= 'TRUE'/>
                                <Value Type='User'>" + SPContext.Current.Web.CurrentUser.ID + @"</Value>
                             </Eq>
                             <Eq>
                                <FieldRef Name='" + CustomSiteColumns.FIELD_SOLICITUD_PRESTAMOS_ESTADO + @"' />
                                <Value Type='Choice'>" + EstadoDePrestamo.Aceptado + @"</Value>
                             </Eq>
                          </And>
                       </Where>";

            listResult = CargarSolicitudes(query, SPContext.Current.Web.CurrentUser);

            return listResult;
        }

        public static List<SolicitudDePrestamosContentType> ObtenerDevoluciones(Guid targetList, int pageIndex, int pageSize, out int totalRecords)
        {
            List<SolicitudDePrestamosContentType> listResult = new List<SolicitudDePrestamosContentType>();
            int startingPosition = pageIndex * pageSize;

            SPList currentList = SPContext.Current.Web.Lists[targetList];
            SPUser user = SPContext.Current.Web.EnsureUser(currentList.Title);
            SPQuery query = new SPQuery();
            query.Query = @"<Where>
                          <And>
                             <Eq>
                                <FieldRef Name='" + CustomSiteColumns.FIELD_SOLICITUD_PRESTAMOS_USER_PRESTAMO + @"' LookupId= 'TRUE'/>
                                <Value Type='User'>" + user.ID + @"</Value>
                             </Eq>
                             <Eq>
                                <FieldRef Name='" + CustomSiteColumns.FIELD_SOLICITUD_PRESTAMOS_ESTADO + @"' />
                                <Value Type='Choice'>" + EstadoDePrestamo.Espera + @"</Value>
                             </Eq>
                          </And>
                       </Where>";

            listResult = CargarSolicitudes(query, user);
            totalRecords = listResult.Count();

            return listResult.Skip(startingPosition).Take(pageSize).ToList();
        }

        public static bool cancelarSolicitud(int IdSolicitud)
        {
            bool result = false;
            SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                SPUserToken systoken = SPContext.Current.Site.SystemAccount.UserToken;
                using (SPSite currentSite = new SPSite(SPContext.Current.Web.Url, systoken))
                {
                    using (SPWeb currentWeb = currentSite.OpenWeb())
                    {
                        currentWeb.AllowUnsafeUpdates = true;
                        SPList prestamosList = currentWeb.Lists.TryGetList(GlobalConstants.LIST_PRESTAMOS);
                        SPListItem item = prestamosList.GetItemById(IdSolicitud);
                        item[CustomSiteColumns.FIELD_SOLICITUD_PRESTAMOS_ESTADO] = EstadoDePrestamo.Cancelado;
                        item.Update();
                        currentWeb.AllowUnsafeUpdates = false;
                        result = true;
                    }
                }
            });
            return result;
        }
        
        public static bool DevolverRadicado(int IdSolicitud)
        {
            bool result = false;
            SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                SPUserToken systoken = SPContext.Current.Site.SystemAccount.UserToken;
                using (SPSite currentSite = new SPSite(SPContext.Current.Web.Url, systoken))
                {
                    using (SPWeb currentWeb = currentSite.OpenWeb())
                    {
                        currentWeb.AllowUnsafeUpdates = true;
                        SPList prestamosList = currentWeb.Lists.TryGetList(GlobalConstants.LIST_PRESTAMOS);
                        SPListItem item = prestamosList.GetItemById(IdSolicitud);
                        item[CustomSiteColumns.FIELD_SOLICITUD_PRESTAMOS_ESTADO] = EstadoDePrestamo.Espera;
                        item.Update();
                        currentWeb.AllowUnsafeUpdates = false;
                        result = true;
                    }
                }
            });
            return result;
        }

        public static List<SolicitudDePrestamosContentType> CargarSolicitudes(SPQuery QuerySolicitudes, SPUser currentUser)
        {
            List<SolicitudDePrestamosContentType> listResult = new List<SolicitudDePrestamosContentType>();

            SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                SPUserToken systoken = SPContext.Current.Site.SystemAccount.UserToken;
                using (SPSite currentSite = new SPSite(SPContext.Current.Web.Url, systoken))
                {
                    using (SPWeb currentWeb = currentSite.OpenWeb())
                    {
                        SPList prestamosList = currentWeb.Lists.TryGetList(GlobalConstants.LIST_PRESTAMOS);
                        if (prestamosList != null)
                        {
                            SPListItemCollection resultColl = prestamosList.GetItems(QuerySolicitudes);
                            foreach (SPListItem item in resultColl)
                            {
                                //new SPFieldUserValue(SPContext.Current.Web, item[CustomSiteColumns.FIELD_SOLICITUD_PRESTAMOS_USER_SOLICITUD].ToString()).User.Name + "";
                                SolicitudDePrestamosContentType solicitud = new SolicitudDePrestamosContentType();
                                solicitud.UsuarioSolicitud = new SPFieldUserValue(currentWeb, item[CustomSiteColumns.FIELD_SOLICITUD_PRESTAMOS_USER_SOLICITUD].ToString()).User.LoginName + "";
                                solicitud.UsuarioPrestamo = new SPFieldUserValue(currentWeb, item[CustomSiteColumns.FIELD_SOLICITUD_PRESTAMOS_USER_PRESTAMO].ToString()).User.LoginName + "";
                                solicitud.ObservacionesSolicitud = item[CustomSiteColumns.FIELD_SOLICITUD_PRESTAMOS_OBS_SOLICITUD] + "";
                                solicitud.ObservacionesPrestamo = item[CustomSiteColumns.FIELD_SOLICITUD_PRESTAMOS_OBSERVACIONES_PRESTAMO] + "";
                                solicitud.DepartamentoUsuarioSolicitud = item[CustomSiteColumns.FIELD_SOLICITUD_PRESTAMOS_USER_DEPT_SOLICITUD] + "";
                                solicitud.DepartamentoUsuarioPrestamo = item[CustomSiteColumns.FIELD_SOLICITUD_PRESTAMOS_USER_DEPT_PRESTAMO] + "";
                                solicitud.EstadoDePrestamo = returnEstadoDePrestamo(item[CustomSiteColumns.FIELD_SOLICITUD_PRESTAMOS_ESTADO] + "");
                                solicitud.TipoDePrestamo = returnTipoPrestamo(item[CustomSiteColumns.FIELD_SOLICITUD_PRESTAMOS_TIPO] + "");
                                solicitud.IDRadicadoExpediente = item[CustomSiteColumns.FIELD_SOLICITUD_PRESTAMOS_ID_RADICADO] + "";
                                solicitud.Id = item.ID;
                                solicitud.FechaDeSolicitud = DateTime.Parse(item[SPBuiltInFieldId.Created] + "");
                                solicitud.FechaDePrestamo = TryToDateTime(item[CustomSiteColumns.FIELD_SOLICITUD_PRESTAMOS_FECHA_PRESTAMO] + "");
                                solicitud.FechaDeDevolución = TryToDateTime(item[CustomSiteColumns.FIELD_SOLICITUD_PRESTAMOS_FECHA_DEVOLCION] + "");
                                solicitud.DiasVencimiento = EstadoVencimiento(TryToDateTime(item[CustomSiteColumns.FIELD_SOLICITUD_PRESTAMOS_FECHA_PRESTAMO] + ""));
                                listResult.Add(solicitud);
                            }
                        }
                    }
                }
            });

            return listResult;
        }

        private static TipoDePrestamo returnTipoPrestamo(string prestamo)
        {
            if (prestamo == TipoDePrestamo.Expediente.ToString())
            {
                return TipoDePrestamo.Expediente;
            }
            else
            {
                return TipoDePrestamo.Radicado;
            }
        }

        private static EstadoDePrestamo returnEstadoDePrestamo(string estado)
        {
            switch (estado)
            {
                case "Aceptado":
                    return EstadoDePrestamo.Aceptado;
                    break;
                case "Devuelto":
                    return EstadoDePrestamo.Devuelto;
                    break;
                case "Pendiente":
                    return EstadoDePrestamo.Pendiente;
                    break;
                case "Rechazado":
                    return EstadoDePrestamo.Rechazado;
                    break;
                default:
                    return EstadoDePrestamo.None;
                    break;
            }
        }

        private static string EstadoVencimiento(DateTime? FechaPrestamo)
        {
            string Estado = string.Empty;
            int dias = ListHelper.TryToParse(ConfigurationHelper.GetInstance().ConfigItems[GlobalConstants.DIAS_DE_PRESTAMOS_RADICADOS_EXPEDIENTES]);

            if (FechaPrestamo.HasValue)
            {
                DateTime dtPrestamo = FechaPrestamo.Value.AddDays(dias);
                if (DateTime.Now.Date > dtPrestamo.Date)
                {
                    Estado = "Vencido";
                }
                else
                {
                    TimeSpan ts = dtPrestamo - DateTime.Parse(FechaPrestamo.Value.ToString());
                    int differenceInDays = ts.Days;
                    Estado =  differenceInDays + "";
                }
            }
            

            return Estado;
        }

        private static DateTime? TryToDateTime(string value)
        {
            DateTime date;
            bool result = DateTime.TryParse(value, out date);
            if (result)
            {
                return date;
            }
            else
            {
                return null;
            }
        }
    }
}
